"""
在做程序开发中，我们常常会遇到这样的需求：需要执行对象里的某个方法，或需要调用对象中的某个变量，
但是由于种种原因我们无法确定这个方法或变量是否存在，这是我们需要用一个特殊的方法或机制要访问和
操作这个未知的方法或变量，这中机制就称之为反射。

1.hasattr:
    判断对象中是否有这个方法或变量
2.getattr
    获取对象中的方法或变量的内存地址
3.setattr
    为对象添加变量或方法
4.delattr
    删除对象中的变量。注意：不能用于删除方法
"""


class Person(object):
    def __init__(self,name):
        self.name = name

    def talk(self):
        return '{}正在写代码！'.format(self.name)


person = Person('张亚飞')
print(hasattr(person,'name'))   #True
print(hasattr(person,'talk'))   #True
print(hasattr(person,'asc'))    #False

print(getattr(person,'name'))
print(getattr(person,'talk')())
print(getattr(person,'asc','not find'))


def abc(self):
    print('{}哈哈哈哈哈哈'.format(self.name))

setattr(person,'say',abc)    # 将abc函数添加到对象中p中，并命名为talk
person.say(person)          # 调用talk方法，因为这是额外添加的方法，需手动传入对象

setattr(person,'age',23)
print(person.age)

print(person.name)
delattr(person,'name')  #删除name变量
print(person.name)      #此时将报错
